package demo.day10

fun main() {
    val student1 = Student("Kiki", 18, 'M')
    val student2 = Student("QiQi", 18, 'W')
    val teacher1 = Teacher("JiJi", 28, 'M')
    val teacher2 = Teacher("Oooo", 28, 'W')

//    println(KtBase03(true, student1).getObj())
//    println(KtBase03(false, student2).getObj())
//    println(KtBase03(true, teacher1).getObj())
//    println(KtBase03(false, teacher2).getObj())
    // 为null的话就不会执行run里面的方法 run返回对象为代码最后一行
    KtBase03(true, student1).getObj()?.run {
        println(this)
    }
    KtBase03(false, student1).getObj()?.run {
        println(this)
    } ?: println("返回数据为空")
    // apply
    KtBase03(true, student1).getObj()?.apply {
        println(this)
    } ?: println("返回数据为空")

    // apply 只会返回对象本身
    KtBase03(false, student1).getObj().apply {
        if (this == null) {
            println("返回数据为空")
        } else {
            println(this)
        }
    }
    // also
    show("aaaa")
    show(null)
}

fun <T> show(item: T) {
    // also 括号里面是item本身
    item?.also {
        println("传入的数据为$item")
    } ?: println("传入的数据为null")
}


class KtBase03<T>(private val isReal: Boolean, private val obj: T) {
    // takeif{boolean}如果boolean 为true 返回obj 为false返回 null
    fun getObj() = obj.takeIf { isReal }
}